home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 32
/
Aminet 32 (1999)(Schatztruhe)[!][Aug 1999].iso
/
Aminet
/
dev
/
amos
/
modifile.lha
/
ModificaFileEng.AMOS
/
ModificaFileEng.amosSourceCode
Wrap
AMOS Source Code
|
1999-04-24
|
16KB
|
551 lines
'-> ModificaFileEng by Stefano Regattin
'd> 15 febbraio 1998 da Guardafile2Eng
'm> 16 febbraio 1998
'm> 20 marzo 1998
'm> 13 aprile 1998
'm> 10,11 maggio 1998
'm> 26,27 giugno 1998
'm> 3,4 gennaio 1999
'm> 4,6,12,15,24 aprile 1999
'----------------------------
Set Buffer 260
Dim PAGINA(65534)
'------------------------------------------------------------------
'The pages can't be more of the variables PAGINA(), that are 65535
'------------------------------------------------------------------
'The array PAGINA() holds the address for each page
'The string FILE$ holds the whole path and name of the file to read
'The string NOMEFILE$ holds the name of the file to read
'The string PERCORSO$ holds the path of the file to read
'The variable BANCO holds the number of the bank used
'The variable BYTE holds the number of the byte to show
'The variable BYTEPERLINEA holds the number of bytes to show in exadecimal
' mode
'If the flag CARATTEREINVISIBILE is activated, the program will show the
' invisible characters
'The variable CARATTEREMESSAGGIO holds the character to be shown for the
' scroll of the message
'The variable DATO holds the datum to show
'If the flag ESADECIMALE is activated, the program will show the data in
' exadecimal format
'The flag FILENONTROVATO inform the program that there isn't a file to load
'The variable PAGINA holds the number of the current page
'The variable POSIZIONE holds the address of the datum
'If the flag SENZAMEMORIA is activated, the program quits
'If the flag TESTO is activated, the program will show the data as a text
'If the flag TESTOTAGLIATO is activated, the program will forget the
' characters that go out from the screen right margin
'The variable ULTIMALINEA holds the number of the latest line of the screen
'The variable _ERRORE holds the number of the error that occurs when the
' program exceeds the maximum number of pages allowed
BANCO=65535
Global FILE$,NOMEFILE$,PERCORSO$
Global BANCO,BYTE,BYTEPERLINEA,CARATTEREINVISIBILE,CARATTEREMESSAGGIO,DATO
Global ESADECIMALE,FILENONTROVATO,M0DIFICA,PAGINA,POSIZIONE,SENZAMEMORIA,TESTO,TESTOTAGLIATO
Global ULTIMALINEA,_ERRORE
Global PAGINA()
Proc SETTASCHERMO
Proc ARCOBALENO
Do
Proc CARICAUNFILE : Exit If FILENONTROVATO=True
M0DIFICA=False
Repeat
If SENZAMEMORIA=True
TIC["Insufficient memory, press a key",ULTIMALINEA]
Wait Key : Exit
End If
Proc SCELTE
Proc VISUALIZZA
Cls : Proc TIC["Do you want to see it again (y/n) ?",ULTIMALINEA]
RISPOSTA$=Input$(1) : RISPOSTA$=Lower$(RISPOSTA$)
Until RISPOSTA$<>"y"
Loop
Rainbow Del 0 : Screen Close 0 : Erase BANCO : End
Procedure ARCOBALENO
'--------
'Rainbow
'--------
Data $FFF,$EEE,$DDD,$CCC,$BBB,$AAA,$999,$888
Data $FFF,$EEE,$DDD,$CCC,$BBB,$AAA,$999,$888
Set Rainbow 0,1,16,"","",""
For LINEA=0 To 15 : Read DATO : Rain(0,LINEA)=DATO : Next LINEA
If Ntsc Then LUNGHEZZAARCOBALENO=223 Else LUNGHEZZAARCOBALENO=271
Rainbow 0,2,0,LUNGHEZZAARCOBALENO
End Proc
Procedure CARICAUNFILE
'-------------
'Loads a file
'-------------
Show On : Cls
FILE$=Fsel$("**","","Load a file","Press Esc to quit")
If FILE$<>"" and Exist(FILE$)
Open In 1,FILE$
LUNGHEZZABANCO=Lof(1)
Close 1
SEPARATORE=Instr(FILE$,":") : POSIZIONE=1
For A=1 To Len(FILE$)
If Instr(FILE$,"/",POSIZIONE)>0
SEPARATORECASSETTO=Instr(FILE$,"/",POSIZIONE)
POSIZIONE=SEPARATORECASSETTO+1
End If
Next A
SEPARATORE=Max(SEPARATORE,SEPARATORECASSETTO)
PERCORSO$=Left$(FILE$,SEPARATORE)
NOMEFILE$=Right$(FILE$,Len(FILE$)-SEPARATORE)
MEMORIA=Chip Free+Fast Free
If LUNGHEZZABANCO>MEMORIA
Proc TIC["There is no memory to load the file",ULTIMALINEA-1]
Proc TIC[NOMEFILE$,ULTIMALINEA] : Wait 200
SENZAMEMORIA=True
Else
Reserve As Work BANCO,LUNGHEZZABANCO
Bload FILE$,Start(BANCO)
SENZAMEMORIA=False
End If
Else
FILENONTROVATO=True
End If
End Proc
Procedure DASTRINGAANUMERO[DATO$]
DATO$=Upper$(DATO$)
If DATO$="0"
D=0
Else If DATO$="1"
D=1
Else If DATO$="2"
D=2
Else If DATO$="3"
D=3
Else If DATO$="4"
D=4
Else If DATO$="5"
D=5
Else If DATO$="6"
D=6
Else If DATO$="7"
D=7
Else If DATO$="8"
D=8
Else If DATO$="9"
D=9
Else If DATO$="A"
D=10
Else If DATO$="B"
D=11
Else If DATO$="C"
D=12
Else If DATO$="D"
D=13
Else If DATO$="E"
D=14
Else If DATO$="F"
D=15
Else
D=16
End If
End Proc[D]
Procedure LIMITI[NUMERO,LIMITEMINIMO,LIMITEMASSIMO]
'----------------------
'Limits of two numbers
'----------------------
'-> Limiti by Stefano Regattin
'i> 19 maggio 1996
'm> 12 giugno 1996
'------------------------------------------------------------
'The procedure is equivalent to the following program lines:
' If NUMERO<LIMITEMINIMO Then NUMERO=LIMITEMINIMO
' If NUMERO>LIMITEMASSIMO Then NUMERO=LIMITEMASSIMO
'If LIMITEMINIMO is major of LIMITEMASSIMO it swaps the values
'--------------------------------------------------------------
If LIMITEMINIMO>LIMITEMASSIMO Then Swap LIMITEMINIMO,LIMITEMASSIMO
NUMERO=Max(Min(NUMERO,LIMITEMASSIMO),LIMITEMINIMO)
End Proc[NUMERO]
Procedure MERITI
'--------
'Credits
'--------
Cls
Centre "ModificaFile has been realized by AMOS Professional version 2.00"
Print : Print
Centre "and compiled by AMOS Professional Compiler version 2.00"
Print : Print
Centre "If you decide to use it, send by post five (5) U.S. dollars to the following"
Print : Print
Centre "name and address:"
Print : Print
Centre "Stefano Regattin"
Print : Print
Centre "piazza Pietro Gasparri, 4"
Print : Print
Centre "scala U numero 327"
Print : Print
Centre "c.a.p. 20161"
Print : Print
Centre "Milano"
Print : Print
Centre "Italia (Italy)"
Proc TIC["press a key",ULTIMALINEA]
Wait Key
BYTE=0 : POSIZIONE=PAGINA(PAGINA)-1
End Proc
Procedure MESSAGGIO[MESSAGGIO$]
Locate 0,ULTIMALINEA
Hscroll 1
Add CARATTEREMESSAGGIO,1,1 To Len(MESSAGGIO$)
Text 631,ULTIMALINEA*8-1+7,Mid$(MESSAGGIO$,CARATTEREMESSAGGIO,1)
Wait 5
End Proc
Procedure M0DIFICA
Fade 5,$66
Get Block 1,0,248,640,8
Proc TIC["Cursor keys>position Tab>hexadecimal mode Typing>ASCII Enter>exit",ULTIMALINEA]
Curs On : BYTE=0
'CURSOREX=8+BYTEPERLINEA+1 : CURSOREY=0 : Locate CURSOREX,CURSOREY
'M0DOMODIFICA$="HEX"
Print At(8,0);
M0DOMODIFICA$="ASCII"
Repeat
Repeat
TASTOPREMUTO$=Inkey$
Until TASTOPREMUTO$<>""
If TASTOPREMUTO$=Tab$
TASTODITABULAZIONEPREMUTO=True
CURSOREY=BYTE/BYTEPERLINEA
If M0DOMODIFICA$="ASCII"
M0DOMODIFICA$="HEX"
CURSOREX=8+BYTEPERLINEA+1+(BYTE mod BYTEPERLINEA)*3
Locate CURSOREX,CURSOREY
Proc TIC["Cursor keys>position Tab>ASCII mode Typing>hexadecimal Enter>exit",ULTIMALINEA]
Else If M0DOMODIFICA$="HEX"
M0DOMODIFICA$="ASCII"
Print At(8+BYTE mod BYTEPERLINEA,CURSOREY);
Proc TIC["Cursor keys>position Tab>hexadecimal mode Typing>ASCII Enter>exit",ULTIMALINEA]
End If
End If
If M0DOMODIFICA$="ASCII"
If TASTOPREMUTO$=Cup$
Add BYTE,-BYTEPERLINEA,0 To BYTEPERLINEA*31-1
End If
If TASTOPREMUTO$=Cdown$
Add BYTE,BYTEPERLINEA,0 To BYTEPERLINEA*31-1
End If
If TASTOPREMUTO$=Cleft$
Add BYTE,-1,0 To BYTEPERLINEA*31-1
End If
If TASTOPREMUTO$=Cright$
Add BYTE,1,0 To BYTEPERLINEA*31-1
End If
If PAGINA(PAGINA)+BYTE>Length(BANCO)-1
BYTE=0
End If
CURSOREY=BYTE/BYTEPERLINEA
If CURSOREY=31
Locate 8,0 : BYTE=0 : CURSOREY=0
End If
Print At(8+BYTE mod BYTEPERLINEA,CURSOREY);
TASTOPREMUTO=Asc(TASTOPREMUTO$)
If TASTOPREMUTO>31
DATO=TASTOPREMUTO
Proc MOSTRADATO
CURSOREX=8+BYTEPERLINEA+1+(BYTE mod BYTEPERLINEA)*3
Print At(CURSOREX,CURSOREY);Hex$(TASTOPREMUTO,2)-"$";
Print At(8+BYTE mod BYTEPERLINEA+1,CURSOREY);
Poke Start(BANCO)+PAGINA(PAGINA)+BYTE,DATO
Inc BYTE
M0DIFICA=True
End If
End If
If M0DOMODIFICA$="HEX"
If TASTOPREMUTO$=Cup$
Add CURSOREY,-1,0 To 30
End If
If TASTOPREMUTO$=Cdown$
Add CURSOREY,1,0 To 30
End If
If TASTOPREMUTO$=Cleft$
Add CURSOREX,-3,8+BYTEPERLINEA+1 To 8+BYTEPERLINEA+1+(BYTEPERLINEA-1)*3
End If
If TASTOPREMUTO$=Cright$
Add CURSOREX,3,8+BYTEPERLINEA+1 To 8+BYTEPERLINEA+1+(BYTEPERLINEA-1)*3
End If
BYTE=(CURSOREX-8-BYTEPERLINEA-1)/3+CURSOREY*BYTEPERLINEA
If PAGINA(PAGINA)+BYTE>Length(BANCO)-1
BYTE=0 : CURSOREX=8+BYTEPERLINEA+1 : CURSOREY=0
End If
Locate CURSOREX,CURSOREY
DATO=Peek(Start(BANCO)+PAGINA(PAGINA)+BYTE)
Proc DASTRINGAANUMERO[TASTOPREMUTO$] : TASTOPREMUTO=Param
If TASTOPREMUTO<16 and TASTODITABULAZIONEPREMUTO=False
Print Hex$(TASTOPREMUTO,1)-"$";
DATO=TASTOPREMUTO*16
Repeat
DATO$=Input$(1)
Proc DASTRINGAANUMERO[DATO$] : D=Param
Until D<16
Print Hex$(D,1)-"$";
Add DATO,D
Poke Start(BANCO)+PAGINA(PAGINA)+BYTE,DATO
Print At(8+BYTE mod BYTEPERLINEA,CURSOREY);
Proc MOSTRADATO
Inc BYTE
If PAGINA(PAGINA)+BYTE>Length(BANCO)-1
BYTE=0 : CURSOREX=8+BYTEPERLINEA+1 : CURSOREY=0
End If
Add CURSOREX,3
If CURSOREX>8+BYTEPERLINEA+1+(BYTEPERLINEA-1)*3
CURSOREX=8+BYTEPERLINEA+1 : Inc CURSOREY
If CURSOREY>30
BYTE=0 : CURSOREY=0
End If
End If
Locate CURSOREX,CURSOREY
M0DIFICA=True
End If
End If
TASTODITABULAZIONEPREMUTO=False
Until TASTOPREMUTO$=Chr$(13)
Curs Off
Put Block 1
Fade 5,$60
End Proc
Procedure MOSTRADATO
'----------------
'Shows the datum
'----------------
If DATO<32
If CARATTEREINVISIBILE=True
Inverse On : Print Chr$(DATO+64); : Inverse Off
End If
Else
Print Chr$(DATO);
End If
End Proc
Procedure SALVAILFILE
'---------------
'Saves the file
'---------------
Get Block 1,0,248,640,8
If M0DIFICA=True
Proc TIC["Do you really want to save the file (y/n) ?",ULTIMALINEA]
RISPOSTA$=Input$(1) : RISPOSTA$=Lower$(RISPOSTA$)
If RISPOSTA$="y"
If Exist(FILE$)
Bsave FILE$,Start(BANCO) To Start(BANCO)+Length(BANCO)
Proc TIC["Saving the file "+FILE$,ULTIMALINEA]
Wait 200
End If
End If
Else
Proc TIC["The file hasn't been modified!",ULTIMALINEA]
Wait 200
End If
Put Block 1
End Proc
Procedure SCELTE
'--------------------
'Choices of the user
'--------------------
Hide On : Cls : Proc TIC["Do you want to see the exadecimal value (y/n) ?",ULTIMALINEA-1]
RISPOSTA$=Input$(1) : RISPOSTA$=Lower$(RISPOSTA$)
If RISPOSTA$="y"
ESADECIMALE=True
TESTO=False
CARATTEREINVISIBILE=True
Proc TIC["Number of Byte for line (01-18) ?",ULTIMALINEA]
BYTEPERLINEA$=Input$(2) : BYTEPERLINEA=Val(BYTEPERLINEA$)
Proc LIMITI[BYTEPERLINEA,1,18] : BYTEPERLINEA=Param
Else
ESADECIMALE=False
Cls : Proc TIC["Do you want to see it as text (y/n) ?",ULTIMALINEA-1]
RISPOSTA$=Input$(1) : RISPOSTA$=Lower$(RISPOSTA$)
If RISPOSTA$="y"
TESTO=True
Proc TIC["Do you want to cut the text if it exceeds the screen right margin (y/n) ?",ULTIMALINEA]
RISPOSTA$=Input$(1) : RISPOSTA$=Lower$(RISPOSTA$)
If RISPOSTA$="y"
TESTOTAGLIATO=True
Else
TESTOTAGLIATO=False
End If
Else
TESTO=False
End If
Cls : Proc TIC["Do you want to see the invisible characters (y/n) ?",ULTIMALINEA]
RISPOSTA$=Input$(1) : RISPOSTA$=Lower$(RISPOSTA$)
If RISPOSTA$="y"
CARATTEREINVISIBILE=True
Else
CARATTEREINVISIBILE=False
End If
End If
Cls
End Proc
Procedure SETTASCHERMO
'----------------
'Sets the screen
'----------------
If Ntsc Then LUNGHEZZASCHERMO=200 Else LUNGHEZZASCHERMO=256
ULTIMALINEA=LUNGHEZZASCHERMO/8-1
Screen Open 0,640,LUNGHEZZASCHERMO,4,Hires : Curs Off : Flash Off
Set Curs 170,85,170,85,170,85,170,85 : Palette $60,$CCC,0,0 : Pen 1 : Paper 0 : Cls
Flash 3,"(011,1)(033,2)(055,3)(077,4)(099,5)(0BB,6)(0DD,7)(0FF,8)(0DD,7)(0BB,6)(099,5)(077,4)(055,3)(033,2)"
Wait Vbl : Limit Mouse
End Proc
Procedure TIC[TESTO$,LINEA]
'-----------------------------
'Centres and inverts a string
'-----------------------------
'-> Testo Invertito e Centrato by Stefano Regattin
'i> 23 maggio 1996
'm> 25 maggio 1996
'--------------------------------------------------------------------------
'LINEA holds the line number where the string will be positioned; if is -1
' (True) the string will be positioned at the position of the cursor
'--------------------------------------------------------------------
If LINEA=True Then L=Y Curs Else L=LINEA
Locate 0,L : Inverse On : Cline : Centre TESTO$ : Inverse Off
End Proc
Procedure VISUALIZZA
'---------------
'Shows the file
'---------------
MESSAGGIO1$=NOMEFILE$+Str$(Length(BANCO))+" Bytes..."
MESSAGGIO2$="cursor up -> page up...cursor down -> page down..."
MESSAGGIO3$="cursor up -> page up..."
MESSAGGIO4$="cursor down -> page down..."
MESSAGGIO5$="C -> credits...S -> Save the file...Esc -> exit..."
M0DO$="View mode...Enter -> modify (only in exadecimal mode)..."
BYTE=0 : PAGINA=0
For POSIZIONE=0 To Length(BANCO)-1
'------------------------------------------------------------------------
'The cycle For starts from zero to permit the numeration of the lines in
' exadecimal starting from one
'------------------------------
TASTOPREMUTO$=Inkey$
Exit If TASTOPREMUTO$=Chr$(27)
DATO=Peek(Start(BANCO)+POSIZIONE)
If ESADECIMALE=True
Add BYTE,1,1 To BYTEPERLINEA
If BYTE=1
Print At(0,);Hex$(POSIZIONE+1,7)-"$"+" ";
End If
Proc MOSTRADATO
Else
If TESTO=True and TESTOTAGLIATO=True
If X Curs<79
If X Curs=0
If ULTIMACOLONNA=False
Proc MOSTRADATO
Else
If DATO=10
ULTIMACOLONNA=False
End If
End If
Else
Proc MOSTRADATO
End If
Else
Proc MOSTRADATO
If X Curs=0
Cmove ,-1 : ULTIMACOLONNA=True
End If
End If
Else
Proc MOSTRADATO
End If
If DATO=10 and TESTO=True
Print
End If
End If
If ESADECIMALE=True
Print At(8+BYTEPERLINEA+BYTE*3-2,);Hex$(DATO,2)-"$";At(8+BYTE,);
If BYTE=BYTEPERLINEA and BYTEPERLINEA<18
Print
End If
End If
If POSIZIONE=Length(BANCO)-1
PAGINA$="page"+Str$(PAGINA+1)+"..."
CARATTEREMESSAGGIO=0
Ink 1 : Bar 0,248 To 639,255 : Ink 0,1
Do
Repeat
TASTOPREMUTO$=Inkey$
If PAGINA=0
Proc MESSAGGIO[MESSAGGIO1$+PAGINA$+MESSAGGIO5$+M0DO$]
Else
Proc MESSAGGIO[MESSAGGIO1$+PAGINA$+MESSAGGIO3$+MESSAGGIO5$+M0DO$]
End If
Until TASTOPREMUTO$<>""
Exit If TASTOPREMUTO$=Chr$(27),2
If TASTOPREMUTO$="c"
Proc MERITI : Cls : Exit
End If
If TASTOPREMUTO$="s"
Proc SALVAILFILE
End If
If TASTOPREMUTO$=Cup$ and PAGINA>0
Dec PAGINA : POSIZIONE=PAGINA(PAGINA)-1 : BYTE=0 : Cls : Exit
End If
Memorize X : Memorize Y
If TASTOPREMUTO$=Chr$(13) and ESADECIMALE=True
Proc M0DIFICA
End If
Loop
End If
'-----------------------------------------------------------------
'The test IF POSIZIONE=Length(BANCO)-1 must be before of the test
' IF Y Curs=ULTIMALINEA to avoid a blank screen if the end of the file
' coincides on screen with the latest line of data
'--------------------------------------------------
If Y Curs=ULTIMALINEA
PAGINA$="page"+Str$(PAGINA+1)+"..."
CARATTEREMESSAGGIO=0
Ink 1 : Bar 0,248 To 639,255 : Ink 0,1
Do
Repeat
TASTOPREMUTO$=Inkey$
If PAGINA=0
Proc MESSAGGIO[MESSAGGIO1$+PAGINA$+MESSAGGIO4$+MESSAGGIO5$+M0DO$]
Else
Proc MESSAGGIO[MESSAGGIO1$+PAGINA$+MESSAGGIO2$+MESSAGGIO5$+M0DO$]
End If
Until TASTOPREMUTO$<>""
Exit If TASTOPREMUTO$=Chr$(27),2
If TASTOPREMUTO$="c"
Proc MERITI : Exit
End If
If TASTOPREMUTO$="s"
Proc SALVAILFILE
End If
If TASTOPREMUTO$=Cup$ and PAGINA>0
Dec PAGINA : POSIZIONE=PAGINA(PAGINA)-1 : _ERRORE=0 : Exit
End If
If TASTOPREMUTO$=Cdown$
On Error Proc _ERRORE
Inc PAGINA : PAGINA(PAGINA)=POSIZIONE+1
If _ERRORE=0
Exit
End If
End If
If TASTOPREMUTO$=Chr$(13) and ESADECIMALE=True
Proc M0DIFICA
End If
Loop
Cls : Rem Cancella lo schermo per una nuova videata
End If
Next POSIZIONE
End Proc
Procedure _ERRORE
'------
'Error
'------
_ERRORE=Errn
If _ERRORE=23
Dec PAGINA
Get Block 1,0,248,640,8
Proc TIC["Sorry, maximum number of pages reached",ULTIMALINEA]
Wait 200
Put Block 1
End If
Resume Next
End Proc